#include "gtkatcontextprivate.h"
#include "gtkenums.h"
+#include "gtktypebuiltins.h"
#include <stdarg.h>
static void
gtk_accessible_default_init (GtkAccessibleInterface *iface)
{
+ GParamSpec *pspec =
+ g_param_spec_enum ("accessible-role",
+ "Accessible Role",
+ "The role of the accessible object",
+ GTK_TYPE_ACCESSIBLE_ROLE,
+ GTK_ACCESSIBLE_ROLE_WIDGET,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
+ g_object_interface_install_property (iface, pspec);
}
+/*< private >
+ * gtk_accessible_get_at_context:
+ * @self: a #GtkAccessible
+ *
+ * Retrieves the #GtkATContext for the given #GtkAccessible.
+ *
+ * Returns: (transfer none): the #GtkATContext
+ */
GtkATContext *
gtk_accessible_get_at_context (GtkAccessible *self)
{
return GTK_ACCESSIBLE_GET_IFACE (self)->get_at_context (self);
}
+/**
+ * gtk_accessible_get_accessible_role:
+ * @self: a #GtkAccessible
+ *
+ * Retrieves the #GtkAccessibleRole for the given #GtkAccessible.
+ *
+ * Returns: a #GtkAccessibleRole
+ */
+GtkAccessibleRole
+gtk_accessible_get_accessible_role (GtkAccessible *self)
+{
+ g_return_val_if_fail (GTK_IS_ACCESSIBLE (self), GTK_ACCESSIBLE_ROLE_WIDGET);
+
+ GtkATContext *context = gtk_accessible_get_at_context (self);
+ if (context == NULL)
+ return GTK_ACCESSIBLE_ROLE_WIDGET;
+
+ return gtk_at_context_get_accessible_role (context);
+}
+
/**
* gtk_accessible_update_state:
* @self: a #GtkAccessible
G_DECLARE_INTERFACE (GtkAccessible, gtk_accessible, GTK, ACCESSIBLE, GObject)
GDK_AVAILABLE_IN_ALL
-void gtk_accessible_update_state (GtkAccessible *self,
- GtkAccessibleState first_state,
- ...);
+GtkAccessibleRole gtk_accessible_get_accessible_role (GtkAccessible *self);
+
+GDK_AVAILABLE_IN_ALL
+void gtk_accessible_update_state (GtkAccessible *self,
+ GtkAccessibleState first_state,
+ ...);
GDK_AVAILABLE_IN_ALL
-void gtk_accessible_update_state_value (GtkAccessible *self,
- GtkAccessibleState state,
- const GValue *value);
+void gtk_accessible_update_state_value (GtkAccessible *self,
+ GtkAccessibleState state,
+ const GValue *value);
G_END_DECLS
PROP_CSS_NAME,
PROP_CSS_CLASSES,
PROP_LAYOUT_MANAGER,
- NUM_PROPERTIES
+ NUM_PROPERTIES,
+
+ /* GtkAccessible */
+ PROP_ACCESSIBLE_ROLE
};
static GParamSpec *widget_props[NUM_PROPERTIES] = { NULL, };
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, widget_props);
+ g_object_class_override_property (gobject_class, PROP_ACCESSIBLE_ROLE, "accessible-role");
+
/**
* GtkWidget::destroy:
* @object: the object which received the signal
case PROP_LAYOUT_MANAGER:
gtk_widget_set_layout_manager (widget, g_value_dup_object (value));
break;
+ case PROP_ACCESSIBLE_ROLE:
+ priv->accessible_role = g_value_get_enum (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_LAYOUT_MANAGER:
g_value_set_object (value, gtk_widget_get_layout_manager (widget));
break;
+ case PROP_ACCESSIBLE_ROLE:
+ {
+ GtkAccessibleRole role = priv->accessible_role;
+
+ if (priv->accessible_role == GTK_ACCESSIBLE_ROLE_WIDGET)
+ role = gtk_widget_class_get_accessible_role (GTK_WIDGET_GET_CLASS (widget));
+
+ g_value_set_enum (value, role);
+ }
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
priv->halign = GTK_ALIGN_FILL;
priv->valign = GTK_ALIGN_FILL;
+ priv->accessible_role = GTK_ACCESSIBLE_ROLE_WIDGET;
+
priv->width_request = -1;
priv->height_request = -1;
{
GtkWidgetClass *widget_class = GTK_WIDGET_GET_CLASS (self);
GtkWidgetClassPrivate *class_priv = widget_class->priv;
+ GtkAccessibleRole role;
- priv->at_context =
- gtk_at_context_create (class_priv->accessible_role, accessible);
+ /* Widgets have two options to set the accessible role: either they
+ * define it in their class_init() function, and the role applies to
+ * all instances; or an instance is created with the :accessible-role
+ * property (from GtkAccessible) set to anything other than the default
+ * GTK_ACCESSIBLE_ROLE_WIDGET value.
+ *
+ * In either case, the accessible role cannot be set post-construction.
+ */
+ if (priv->accessible_role != GTK_ACCESSIBLE_ROLE_WIDGET)
+ role = priv->accessible_role;
+ else
+ role = class_priv->accessible_role;
+
+ priv->at_context = gtk_at_context_create (role, accessible);
+ priv->accessible_role = role;
}
return priv->at_context;
priv = widget_class->priv;
priv->accessible_role = accessible_role;
}
+
+/**
+ * gtk_widget_class_get_accessible_role:
+ * @widget_class: a #GtkWidgetClass
+ *
+ * Retrieves the accessible role used by the given #GtkWidget class.
+ *
+ * Different accessible roles have different states, and are rendered
+ * differently by assistive technologies.
+ *
+ * See also: gtk_accessible_get_accessible_role()
+ *
+ * Returns: the accessible role for the widget class
+ */
+GtkAccessibleRole
+gtk_widget_class_get_accessible_role (GtkWidgetClass *widget_class)
+{
+ GtkWidgetClassPrivate *priv;
+
+ g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget_class), GTK_ACCESSIBLE_ROLE_WIDGET);
+
+ priv = widget_class->priv;
+ return priv->accessible_role;
+}